# -*- coding: utf-8 -*-
#
# File: Proposta.py
#
# Copyright (c) 2006 by IBICT
# Generator: ArchGenXML Version 1.5.0
#            http://plone.org/products/archgenxml
#
# GNU General Public License (GPL)
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.
#

__author__ = """IBICT <cadu@ibict.br>"""
__docformat__ = 'plaintext'

from AccessControl import ClassSecurityInfo
from Products.Archetypes.atapi import *
from Products.Archetypes.SQLStorage import *
from Products.SIGFS.config import *

# additional imports from tagged value 'import'
from Products.DataGridField.DataGridField import DataGridField
from Products.DataGridField.DataGridWidget import DataGridWidget

##code-section module-header #fill in your manual code here
from Products.Archetypes import transaction
##/code-section module-header

schema = Schema((

    StringField(
        name='eixo',
        index="FieldIndex",
        serchable="1",
        required=1,
        vocabulary='getEixos',
        enforceVocabulary=1,
        widget=SelectionWidget(
            label="Eixo",
            description="Informe o Eixo ao qual a Ação será associada. Este é o eixo do plano estratégico do MCT.",
            format="select",
            label_msgid='SIGFS_label_eixo',
            description_msgid='SIGFS_help_eixo',
            i18n_domain='SIGFS',
        )
    ),

    TextField(
        name='objetivos',
        serchable="1",
        required=1,
        widget=TextAreaWidget(
            label="Objetivos",
            description="Descreva os objetivos da Ação proposta em no máximo 10 linhas.",
            label_msgid='SIGFS_label_objetivos',
            description_msgid='SIGFS_help_objetivos',
            i18n_domain='SIGFS',
        )
    ),

    TextField(
        name='descricao',
        serchable="1",
        required=1,
        widget=TextAreaWidget(
            label="Descrição",
            description="Descreva a Ação proposta em no máximo 30 linhas.",
            label_msgid='SIGFS_label_descricao',
            description_msgid='SIGFS_help_descricao',
            i18n_domain='SIGFS',
        )
    ),

    TextField(
        name='continuidade',
        serchable="1",
        required=1,
        widget=TextAreaWidget(
            label="Proposta de continuidade",
            description="No caso de proposta de continuidade, complementação ou aperfeiçoamento justificar em no máximo 20 linhas.",
            label_msgid='SIGFS_label_continuidade',
            description_msgid='SIGFS_help_continuidade',
            i18n_domain='SIGFS',
        )
    ),

    DataGridField(
        name='recursos',
        serchable="1",
        required=1,
        widget=DataGridWidget(
            label="Recursos dos Fundos Setoriais",
            description="Informe os recursos que cada Fundo Setorial alocará para a Ação. Deve ser informado o custo total estimado por ano (R$ milhões).",
            column_names=('Fundo Setorial', '2007', '2008', 'Total',),
            label_msgid='SIGFS_label_recursos',
            description_msgid='SIGFS_help_recursos',
            i18n_domain='SIGFS',
        ),
        columns=('nome', 'ano1', 'ano2', 'total',)
    ),

    DataGridField(
        name='outros_recursos',
        serchable="1",
        widget=DataGridWidget(
            label="Outras Fontes",
            description="Informe os recursos que estas outras fontes alocarão para a Ação. Deve ser informado o custo total estimado por ano (R$ milhões)",
            column_names=('Nome', '2007', '2008', 'Total',),
            label_msgid='SIGFS_label_outros_recursos',
            description_msgid='SIGFS_help_outros_recursos',
            i18n_domain='SIGFS',
        ),
        columns=('nome', 'ano1', 'ano2', 'total',)
    ),

    StringField(
        name='comite_gestor',
        serchable="1",
        enforceVocabulary=1,
        widget=SelectionWidget(
            label="Comitê Gestor",
            description="Selecione o Comitê Gestor proponente da Ação, quando for o caso.",
            format="select",
            label_msgid='SIGFS_label_comite_gestor',
            description_msgid='SIGFS_help_comite_gestor',
            i18n_domain='SIGFS',
        ),
        vocabulary='getFundos',
        required=1
    ),

    StringField(
        name='agencia',
        serchable="1",
        enforceVocabulary=1,
        widget=SelectionWidget(
            label="Agência",
            description="Selecione a Agência proponente da Ação, quando for o caso.",
            format="select",
            label_msgid='SIGFS_label_agencia',
            description_msgid='SIGFS_help_agencia',
            i18n_domain='SIGFS',
        ),
        vocabulary='getAgenciasProponentes',
        required=1
    ),

    StringField(
        name='entidades',
        serchable="1",
        enforceVocabulary=1,
        widget=SelectionWidget(
            label="Entidades",
            description="Selecione Entidade proponente da Ação, quando for o caso.",
            format="select",
            label_msgid='SIGFS_label_entidades',
            description_msgid='SIGFS_help_entidades',
            i18n_domain='SIGFS',
        ),
        vocabulary='getEntidadesProponentes',
        required=1
    ),

    StringField(
        name='responsavel',
        index="FieldIndex",
        serchable="1",
        required=1,
        widget=StringWidget(
            label="Nome do responsável",
            description="Informe o nome do responsável pelo preenchimento da proposta.",
            label_msgid='SIGFS_label_responsavel',
            description_msgid='SIGFS_help_responsavel',
            i18n_domain='SIGFS',
        )
    ),

    StringField(
        name='email',
        serchable="1",
        required=1,
        widget=StringWidget(
            label="Email",
            description="Informe o email do responsável pelo preenchimento da proposta.",
            label_msgid='SIGFS_label_email',
            description_msgid='SIGFS_help_email',
            i18n_domain='SIGFS',
        ),
        validators=('isEmail',)
    ),

    StringField(
        name='telefone',
        serchable="1",
        required=1,
        widget=StringWidget(
            label="Telefone para contato",
            description="Informe o telefone para contato do responsável pelo preenchimento da proposta.",
            label_msgid='SIGFS_label_telefone',
            description_msgid='SIGFS_help_telefone',
            i18n_domain='SIGFS',
        )
    ),

    ComputedField(
        name='valor_total',
        widget=ComputedWidget(
            label="Valor Total da proposta.",
            description="Soma dos valores totais dos fundos setoriais.",
            label_msgid='SIGFS_label_valor_total',
            description_msgid='SIGFS_help_valor_total',
            i18n_domain='SIGFS',
        ),
        expression='context.getValorTotal()'
    ),

),
)

##code-section after-local-schema #fill in your manual code here
##/code-section after-local-schema

Proposta_schema = BaseSchema.copy() + \
    schema.copy()

##code-section after-schema #fill in your manual code here
##/code-section after-schema

class Proposta(BaseContent):
    """
    """
    security = ClassSecurityInfo()
    __implements__ = (getattr(BaseContent,'__implements__',()),)

    # This name appears in the 'add' box
    archetype_name = 'Formulário de Proposta de Ação Transversal'

    meta_type = 'Proposta'
    portal_type = 'Proposta'
    allowed_content_types = []
    filter_content_types = 0
    global_allow = 0
    content_icon = 'action_icon.gif'
    immediate_view = 'base_view'
    default_view = 'proposta_view'
    suppl_views = ()
    typeDescription = "Formulário para encaminhamento de Proposta de Ação Transversal dos Fundos Setorias do MCT para 2007."
    typeDescMsgId = 'description_edit_proposta'
    allow_discussion = 1


    actions =  (


       {'action': "string:${object_url}/proposta_view",
        'category': "object",
        'id': 'view',
        'name': 'View',
        'permissions': ("View",),
        'condition': 'python:1'
       },


       {'action': 'string:${object_url}/folder_localrole_form',
        'category': "object",
        'id': 'sharing',
        'name': 'Sharing',
        'permissions': ("SIGFS: Add Escritorio Virtual Secretaria",),
        'condition': 'python:False'
       },


       {'action': "string:${object_url}/base_metadata",
        'category': "object",
        'id': 'metadata',
        'name': 'Properties',
        'permissions': ("SIGFS: Add Escritorio Virtual Secretaria",),
        'condition': 'python:False'
       },


    )

    _at_rename_after_creation = True

    schema = Proposta_schema

    ##code-section class-header #fill in your manual code here
    ##/code-section class-header

    # Methods

    # Manually created methods

    security.declarePrivate('_renameAfterCreation')
    def _renameAfterCreation(self, check_auto_id=False):
        """Renomeia o objeto com id numérico sequencial de 4 casas decimais."""
        parent_ids = self.aq_inner.aq_parent.objectIds()

        try:
          new_id = 'pp'+'%0.4i' % len(parent_ids)
          # Usando o portal_factory tem que comitar a subtransacao
          transaction.savepoint(optimistic=True)
          self.setId(new_id)
        except:
          # Acha o maior numero entre os ids
          maior = 0
          for i in  parent_ids:
            # O objeto que sera renomeado aparecera na lista com um nome temporario
            # melhor ignorar ele.
            if( (len(i) > 7) or (i[:2] != 'pp')):
              continue
            num_id = int(i[2:])
            if maior < num_id:
              maior = num_id

          new_id = 'pp'+'%0.4i' % (maior + 1)
          # Usando o portal_factory tem que comitar a subtransacao
          transaction.savepoint(optimistic=True)
          self.setId(new_id)

    def getEntidadesProponentes(self):
        """Retorna a lista de Entidades proponentes da Ação"""
        portal_sigfs = getToolByName(self, 'portal_sigfs')
        result = []
        vocabulary = portal_sigfs.getVocab_entidade()

        for item in vocabulary:
            parts = item.split(';')
            result.append([parts[0], parts[1]])

        return DisplayList(tuple(result))

    def getFundos(self):
        """Retorna a lista de Fundos como Comitês Gestores."""
        portal_sigfs = getToolByName(self, 'portal_sigfs')
        result = []
        vocabulary = portal_sigfs.getVocab_fundo()

        for item in vocabulary:
            parts = item.split(';')
            result.append([parts[0], parts[1]])

        return DisplayList(tuple(result))

    def getValorTotal(self):
        """Retorna"""
        try:
                field = self.getWrappedField('recursos')
                grid = field.getAsGrid(self)
                total = 0.0
                for x in range(len(grid)):
                    try:
                        valor = float(grid[x][3].replace(",","."))
                    except:
                        valor = 0.0

                    total += valor
                    
                return total
        except:
                return ""

    def getFundoValor(self):
        """Retorna o nome do primeiro valor(2007)informado no campo recursos"""
        try:
            field = self.getWrappedField('recursos')
            grid = field.getAsGrid(self)
            return grid[0][2]
        except:
            return ""

    def getSecretarias(self):
        """Retorna a lista de Secretarias."""
        portal_sigfs = getToolByName(self, 'portal_sigfs')
        result = []
        vocabulary = portal_sigfs.getVocab_secretaria()

        for item in vocabulary:
            parts = item.split(';')
            result.append([parts[0], parts[1]])

        return DisplayList(tuple(result))

    def getEixos(self):
        """Retorna a lista de Eixos."""
        portal_sigfs = getToolByName(self, 'portal_sigfs')
        result = []
        vocabulary = portal_sigfs.getVocab_eixo()

        for item in vocabulary:
            parts = item.split(';')
            result.append([parts[0], parts[1]])

        return DisplayList(tuple(result))

    def getAgenciasProponentes(self):
        """Retorna a lista de Agências."""
        portal_sigfs = getToolByName(self, 'portal_sigfs')
        result = []
        vocabulary = portal_sigfs.getVocab_agencia()

        for item in vocabulary:
            parts = item.split(';')
            result.append([parts[0], parts[1]])

        return DisplayList(tuple(result))

    def getFundoSetorialUnico(self):
        """ Retorna o nome do primeiro fundo setorial informado no campo recursos"""
        try:
            field = self.getWrappedField('recursos')
            grid = field.getAsGrid(self)
            return grid[0][0]
        except:
            return ""

    def getProponentes(self):
        """Retorna o proponente dessa ação."""
        try:
            STRING_NULA = "Nenhum"
            displayValue = self.displayValue
            comite = displayValue(self.getFundos(), self.comite_gestor)
            agencia = displayValue(self.getAgenciasProponentes(), self.agencia)
            entidades = displayValue(self.getEntidadesProponentes(),self.entidades)
            proponentes_lista = []
            if comite != STRING_NULA:
                proponentes_lista.append("".join(["<li>",comite,"</li>"]))
            if agencia != STRING_NULA:
                proponentes_lista.append("".join(["<li>",agencia,"</li>"]))
            if entidades != STRING_NULA:
                proponentes_lista.append("".join(["<li>",entidades,"</li>"]))

            if len(proponentes_lista) > 0:
                proponentes_resultado = "".join(["<ul>","".join(proponentes_lista),"</ul>"])
            else:
                proponentes_resultado = STRING_NULA

            return proponentes_resultado
        except:
            return ""



registerType(Proposta, PROJECTNAME)
# end of class Proposta

##code-section module-footer #fill in your manual code here
##/code-section module-footer



